﻿using System;
using System.Collections.Generic;
using System.Linq;
using StockCrawlerLib.DAL;
using StockCrawlerLib;
using CrawlerCore;
using HtmlAgilityPack;
using System.Text.RegularExpressions;
using System.Globalization;

namespace CrawlerController
{
    public enum enumSAN
    {
        HOSE = 1,
        HAX = 2,
        UPCOM = 4
    }

    public class FptsCrawler : BaseCrawler
    {

        private void ImportPriceHistoryByStockExchange(string url, int san)
        {
            BrowserSession_General br = new BrowserSession_General();
            string currCode = "";
            int indexColumn = 0;
            try
            {
                HtmlDocument doc = br.Get(url);
                if (br.Response != null)
                {
                    string xpath = "//table[@id='FPTSQuote']//tr[contains(@class,'Status')]";
                    HtmlNodeCollection trNodeCollection = doc.DocumentNode.SelectNodes(xpath);
                    //Kiểm tra có dữ liệu không
                    if (trNodeCollection == null)
                    {
                        string msg = string.Format("Error | Không truy vấn được link {0}", url);
                        SystemConfig.SystemLog.Add(msg);
                        return;
                    }

                    foreach (HtmlNode node in trNodeCollection)
                    {
                        HtmlNodeCollection tdCollection = node.SelectNodes(".//td");
                        if (tdCollection == null)
                        {
                            string msg = string.Format("Error | Không truy vấn được link {0}", url);
                            SystemConfig.SystemLog.Add(msg);
                            continue;
                        }

                        currCode = "";
                        //Ngày giao dịch
                        indexColumn = 0;
                        string dateString = tdCollection[indexColumn].InnerText.Trim();
                        DateTime ngay_giao_dich;
                        if (!DateTime.TryParseExact(dateString, "dd/MM/yyyy", null,
                            DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AdjustToUniversal, out ngay_giao_dich))
                        {
                            //Nếu cột ngày tháng không phải chứa "Tổng" thì có thể báo lỗi
                            if (!dateString.Contains("Tổng"))
                            {
                                //Error
                                string msg = string.Format("Error | {0} - ngay_giao_dich", currCode);
                                SystemConfig.SystemLog.Add(msg);
                            }
                            continue;
                        }

                        //Mã
                        indexColumn++;
                        currCode = tdCollection[indexColumn].InnerText.Trim();
                        if (currCode == "")
                        {
                            //Error
                            string msg = string.Format("Error | Không thấy mã cổ phiếu", currCode);
                            SystemConfig.SystemLog.Add(msg);
                            continue;
                        }

                        //Khởi tạo object history
                        history objHistory;
                        //UPCOM
                        bool isExist = InitHistory(currCode, san, ngay_giao_dich, out objHistory);

                        //Giá tham chiếu
                        indexColumn++;
                        float gia_tham_chieu;
                        if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out gia_tham_chieu))
                        {
                            objHistory.gia_tham_chieu = gia_tham_chieu;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - gia_dong_cua", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Giá trần
                        indexColumn++;
                        float gia_tran = -1;
                        if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out gia_tran))
                        {
                            objHistory.gia_tran = gia_tran;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - gia_tran", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Giá sàn
                        indexColumn++;
                        float gia_san = -1;
                        if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out gia_san))
                        {
                            objHistory.gia_san = gia_san;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - gia_san", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Giá mở cửa
                        indexColumn++;
                        float gia_mo_cua = -1;
                        if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out gia_mo_cua))
                        {
                            objHistory.gia_mo_cua = gia_mo_cua;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - gia_mo_cua", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Giá đóng cửa
                        indexColumn++;
                        float gia_dong_cua;
                        if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out gia_dong_cua))
                        {
                            objHistory.gia_dong_cua = gia_dong_cua;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - gia_dong_cua", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Giá cao nhất
                        indexColumn++;
                        float gia_cao_nhat = -1;
                        if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out gia_cao_nhat))
                        {
                            objHistory.gia_cao_nhat = gia_cao_nhat;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - gia_cao_nhat", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Giá thấp nhất
                        indexColumn++;
                        float gia_thap_nhat = -1;
                        if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out gia_thap_nhat))
                        {
                            objHistory.gia_thap_nhat = gia_thap_nhat;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - gia_thap_nhat", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Trung bình
                        indexColumn++;

                        //Thay đổi
                        indexColumn++;
                        float thay_doi = -1;
                        if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out thay_doi))
                        {
                            objHistory.thay_doi = thay_doi;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - thay_doi", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Thay đổi %
                        indexColumn++;
                        float thay_doi_percent = -1;
                        if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out thay_doi_percent))
                        {
                            objHistory.thay_doi_percent = thay_doi_percent;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - thay_doi_percent", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Khối lượng khớp lệnh
                        indexColumn++;
                        int klgd_khop_lenh = -1;
                        if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out klgd_khop_lenh))
                        {
                            objHistory.klgd_khop_lenh = klgd_khop_lenh;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - klgd_khop_lenh", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Khối lượng thỏa thuận
                        indexColumn++;
                        int klgd_thoa_thuan = -1;
                        if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out klgd_thoa_thuan))
                        {
                            objHistory.klgd_thoa_thuan = klgd_thoa_thuan;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - klgd_thoa_thuan", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Tổng cộng (khối lượng)
                        indexColumn++;

                        //Giá trị khớp lệnh
                        indexColumn++;
                        double gtgd_khop_lenh = -1;
                        if (double.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Float | NumberStyles.AllowThousands, null, out gtgd_khop_lenh))
                        {
                            objHistory.gtgd_khop_lenh = (decimal)gtgd_khop_lenh * 1000000;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - gtgd_khop_lenh", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Giá trị thỏa thuận
                        indexColumn++;
                        double gtgd_thoa_thuan = -1;
                        if (double.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Float | NumberStyles.AllowThousands, null, out gtgd_thoa_thuan))
                        {
                            objHistory.gtgd_thoa_thuan = (decimal)gtgd_thoa_thuan * 1000000;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - gtgd_thoa_thuan", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Tổng cộng (giá trị)
                        indexColumn++;

                        //Cập nhật vào CSDL
                        if (!isExist)
                            _historyRepository.Insert(objHistory);
                        else
                            _historyRepository.Update(objHistory);
                    }
                }
            }
            catch (Exception ex)
            {
                string msg = string.Format("Error | Không truy vấn được link {0}", url);
                SystemConfig.SystemLog.Add(msg);
            }
        }
        /// <summary>
        /// Tổng hợp lịch sử giao dịch theo link:
        /// http://priceboard.fpts.com.vn/user/stock/lich-su/?a=1&c=4&s=&t=2&d=03/07/2015&b=03/06/2015&e=03/07/2015&p=1
        /// </summary>
        /// <param name="currCode"></param>
        public override void ImportPriceHisotry(string currCode, DateTime dtStart)
        {
            string url = "";
            currCode = "";
            string dt = dtStart.Day.ToString() + "/" + dtStart.Month.ToString() + "/" + dtStart.Year.ToString();
            string dtEarlyMonth = dtStart.Day.ToString() + "/" + (dtStart.Month - 1).ToString() + "/" + dtStart.Year.ToString();
            try
            {
                url = string.Format("http://priceboard.fpts.com.vn/user/stock/lich-su/?a=1&c={0}&s={1}&t=2&d={2}&b={3}&e={2}&p=1", (int)enumSAN.HOSE, currCode, dt, dtEarlyMonth);
                ImportPriceHistoryByStockExchange(url, (int)enumSAN.HOSE);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/lich-su/?a=1&c={0}&s={1}&t=2&d={2}&b={3}&e={2}&p=2", (int)enumSAN.HOSE, currCode, dt, dtEarlyMonth);
                ImportPriceHistoryByStockExchange(url, (int)enumSAN.HOSE);
                url = string.Format("http://priceboard.fpts.com.vn/user/stock/lich-su/?a=1&c={0}&s={1}&t=2&d={2}&b={3}&e={2}&p=1", (int)enumSAN.HAX, currCode, dt, dtEarlyMonth);
                ImportPriceHistoryByStockExchange(url, (int)enumSAN.HAX);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/lich-su/?a=1&c={0}&s={1}&t=2&d={2}&b={3}&e={2}&p=2", (int)enumSAN.HAX, currCode, dt, dtEarlyMonth);
                ImportPriceHistoryByStockExchange(url, (int)enumSAN.HAX);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/lich-su/?a=1&c={0}&s={1}&t=2&d={2}&b={3}&e={2}&p=1", (int)enumSAN.UPCOM, currCode, dt, dtEarlyMonth);
                ImportPriceHistoryByStockExchange(url, 9);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/lich-su/?a=1&c={0}&s={1}&t=2&d={2}&b={3}&e={2}&p=2", (int)enumSAN.UPCOM, currCode, dt, dtEarlyMonth);
                ImportPriceHistoryByStockExchange(url, 9);
            }
            catch(Exception ex)
            {
                string msg = string.Format("Error | {0} - Không truy vấn được link {1}", currCode, url);
                SystemConfig.SystemLog.Add(msg);
            }

        }


        private void ImportOrderHistoryByStockExchange(string url)
        {
            BrowserSession_General br = new BrowserSession_General();
            string currCode = "";
            int indexColumn = 0;

            try
            {
                HtmlDocument doc = br.Get(url);
                if (br.Response != null)
                {
                    string xpath = "//table[@id='FPTSQuote']//tr[contains(@class,'Status')]";
                    HtmlNodeCollection trNodeCollection = doc.DocumentNode.SelectNodes(xpath);
                    //Kiểm tra có dữ liệu không
                    if (trNodeCollection == null)
                    {
                        string msg = string.Format("Error | Không truy vấn được link {0}", url);
                        SystemConfig.SystemLog.Add(msg);
                        return;
                    }

                    foreach (HtmlNode node in trNodeCollection)
                    {
                        HtmlNodeCollection tdCollection = node.SelectNodes(".//td");
                        if (tdCollection == null)
                        {
                            string msg = string.Format("Error | Không truy vấn được link {0}", url);
                            SystemConfig.SystemLog.Add(msg);
                            continue;
                        }

                        //Ngày giao dịch
                        indexColumn = 0;
                        string dateString = tdCollection[indexColumn].InnerText.Trim();
                        DateTime ngay_giao_dich;
                        if (!DateTime.TryParseExact(dateString, "dd/MM/yyyy", null,
                            DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AdjustToUniversal, out ngay_giao_dich))
                        {
                            string msg = string.Format("Error | {0} - ngay_giao_dich", currCode);
                            SystemConfig.SystemLog.Add(msg);
                            continue;
                        }

                        //Mã
                        indexColumn++;
                        currCode = tdCollection[indexColumn].InnerText.Trim();

                        //Khởi tạo object history
                        history objHistory;
                        bool isExist = InitHistory(currCode, ngay_giao_dich, out objHistory);

                        //Số lệnh mua
                        indexColumn++;
                        int so_lenh_mua;
                        if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out so_lenh_mua))
                        {
                            objHistory.so_lenh_mua = so_lenh_mua;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - so_lenh_mua", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Khối lượng đặt mua
                        indexColumn++;
                        int kl_dat_mua;
                        if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out kl_dat_mua))
                        {
                            objHistory.kl_dat_mua = kl_dat_mua;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - kl_dat_mua", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Số lệnh bán
                        indexColumn++;
                        int so_lenh_ban;
                        if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out so_lenh_ban))
                        {
                            objHistory.so_lenh_ban = so_lenh_ban;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - so_lenh_ban", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Khối lượng đặt bán
                        indexColumn++;
                        int kl_dat_ban;
                        if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out kl_dat_ban))
                        {
                            objHistory.kl_dat_ban = kl_dat_ban;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - kl_dat_ban", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Cập nhật vào CSDL
                        if (!isExist)
                            _historyRepository.Insert(objHistory);
                        else
                            _historyRepository.Update(objHistory);

                    }
                }
            }
            catch (Exception ex)
            {
                string msg = string.Format("Error | Không truy vấn được link {0}", url);
                SystemConfig.SystemLog.Add(msg);
            }
        }
        /// <summary>
        /// Tổng hợp lịch sử khớp lệnh theo link 
        /// http://priceboard.fpts.com.vn/user/stock/lich-su-lenh/?a=1&c=1&s=&t=5&d=03/07/2015&b=03/06/2015&e=03/07/2015&p=1
        /// </summary>
        /// <param name="currCode"></param>
        public override void ImportOrderHisotry(string currCode, DateTime dtStart)
        {
            string url = "";
            try
            {
                currCode = "";
                string dt = dtStart.Day.ToString() + "/" + dtStart.Month.ToString() + "/" + dtStart.Year.ToString();
                string dtEarlyMonth = dtStart.Day.ToString() + "/" + (dtStart.Month - 1).ToString() + "/" + dtStart.Year.ToString();

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/lich-su-lenh/?a=1&c={0}&s={1}&t=2&d={2}&b={3}&e={2}&p=1", (int)enumSAN.HOSE, currCode, dt, dtEarlyMonth);
                ImportOrderHistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/lich-su-lenh/?a=1&c={0}&s={1}&t=2&d={2}&b={3}&e={2}&p=2", (int)enumSAN.HOSE, currCode, dt, dtEarlyMonth);
                ImportOrderHistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/lich-su-lenh/?a=1&c={0}&s={1}&t=2&d={2}&b={3}&e={2}&p=1", (int)enumSAN.HAX, currCode, dt, dtEarlyMonth);
                ImportOrderHistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/lich-su-lenh/?a=1&c={0}&s={1}&t=2&d={2}&b={3}&e={2}&p=2", (int)enumSAN.HAX, currCode, dt, dtEarlyMonth);
                ImportOrderHistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/lich-su-lenh/?a=1&c={0}&s={1}&t=2&d={2}&b={3}&e={2}&p=1", (int)enumSAN.UPCOM, currCode, dt, dtEarlyMonth);
                ImportOrderHistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/lich-su-lenh/?a=1&c={0}&s={1}&t=2&d={2}&b={3}&e={2}&p=2", (int)enumSAN.UPCOM, currCode, dt, dtEarlyMonth);
                ImportOrderHistoryByStockExchange(url);
            }
            catch (Exception ex)
            {
                string msg = string.Format("Error | {0} - Không truy vấn được link {1}", currCode, url);
                SystemConfig.SystemLog.Add(msg);
            }
        }

        private void ImportForeignHistoryByStockExchange(string url)
        {
            BrowserSession_General br = new BrowserSession_General();
            string currCode = "";
            int indexColumn = 0;

            try
            {
                HtmlDocument doc = br.Get(url);
                if (br.Response != null)
                {
                    string xpath = "//table[@id='FPTSQuote']//tr[contains(@class,'cRow')]";
                    HtmlNodeCollection trNodeCollection = doc.DocumentNode.SelectNodes(xpath);
                    //Kiểm tra có dữ liệu không
                    if (trNodeCollection == null)
                    {
                        string msg = string.Format("Error | Không truy vấn được link {0}", url);
                        SystemConfig.SystemLog.Add(msg);
                        return;
                    }

                    foreach (HtmlNode node in trNodeCollection)
                    {
                        HtmlNodeCollection tdCollection = node.SelectNodes(".//td");
                        if (tdCollection == null)
                        {
                            string msg = string.Format("Error | Không truy vấn được link {0}", url);
                            SystemConfig.SystemLog.Add(msg);
                            continue;
                        }

                        //Ngày giao dịch
                        indexColumn = 0;
                        string dateString = tdCollection[indexColumn].InnerText.Trim();
                        DateTime ngay_giao_dich;
                        if (!DateTime.TryParseExact(dateString, "dd/MM/yyyy", null,
                            DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AdjustToUniversal, out ngay_giao_dich))
                        {
                            string msg = string.Format("Error | {0} - ngay_giao_dich", currCode);
                            SystemConfig.SystemLog.Add(msg);
                            continue;
                        }

                        //Mã
                        indexColumn++;
                        currCode = tdCollection[indexColumn].InnerText.Trim();
                        

                        //Khởi tạo object history
                        history objHistory;
                        bool isExist = InitHistory(currCode, ngay_giao_dich, out objHistory);

                        //Khối lượng sở hữu nước ngoài được phép
                        indexColumn++;
                        int klsh_nn;
                        if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out klsh_nn))
                        {
                            objHistory.klsh_nn = klsh_nn;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - klsh_nn", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //% Sở hữu nước ngoài
                        indexColumn++;
                        float klsh_nn_percent;
                        if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Float, null, out klsh_nn_percent))
                        {
                            objHistory.klsh_nn_percent = klsh_nn_percent;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - klsh_nn_percent", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Khối lượng sở hữu nước ngoài còn lại
                        indexColumn++;
                        int klsh_nn_con_lai;
                        if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out klsh_nn_con_lai))
                        {
                            objHistory.klsh_nn_con_lai = klsh_nn_con_lai;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - klsh_nn_con_lai", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Khối lượng mua
                        indexColumn++;
                        int klgd_nn_mua;
                        if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out klgd_nn_mua))
                        {
                            objHistory.klgd_nn_mua = klgd_nn_mua;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - klgd_nn_mua", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //% Giao dịch toàn thị trường
                        indexColumn++;

                        //Khối lượng bán
                        indexColumn++;
                        int klgd_nn_ban;
                        if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out klgd_nn_ban))
                        {
                            objHistory.klgd_nn_ban = klgd_nn_ban;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - klgd_nn_ban", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Cập nhật vào CSDL
                        if (!isExist)
                            _historyRepository.Insert(objHistory);
                        else
                            _historyRepository.Update(objHistory);
                    }
                }
            }
            catch (Exception ex)
            {
                string msg = string.Format("Error | Không truy vấn được link {0}", url);
                SystemConfig.SystemLog.Add(msg);
            }
        }

        /// <summary>
        /// http://priceboard.fpts.com.vn/user/stock/ndtnn/?a=1&c=1&s=&t=5&d=03/07/2015&b=03/06/2015&e=03/07/2015&p=1
        /// </summary>
        /// <param name="currCode"></param>
        /// <param name="dtStart"></param>
        public override void ImportForeignHistory(DateTime dtStart)
        {
            string url = "";
            string currCode = "";
            try
            {
                
                string dt = dtStart.Day.ToString() + "/" + dtStart.Month.ToString() + "/" + dtStart.Year.ToString();
                string dtEarlyMonth = dtStart.Day.ToString() + "/" + (dtStart.Month - 1).ToString() + "/" + dtStart.Year.ToString();

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/ndtnn/?a=1&c={0}&s={1}&t=5&d={2}&b={3}&e={2}&p=1", (int)enumSAN.HOSE, currCode, dt, dtEarlyMonth);
                ImportForeignHistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/ndtnn/?a=1&c={0}&s={1}&t=5&d={2}&b={3}&e={2}&p=2", (int)enumSAN.HOSE, currCode, dt, dtEarlyMonth);
                ImportForeignHistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/ndtnn/?a=1&c={0}&s={1}&t=5&d={2}&b={3}&e={2}&p=1", (int)enumSAN.HAX, currCode, dt, dtEarlyMonth);
                ImportForeignHistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/ndtnn/?a=1&c={0}&s={1}&t=5&d={2}&b={3}&e={2}&p=2", (int)enumSAN.HAX, currCode, dt, dtEarlyMonth);
                ImportForeignHistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/ndtnn/?a=1&c={0}&s={1}&t=5&d={2}&b={3}&e={2}&p=1", (int)enumSAN.UPCOM, currCode, dt, dtEarlyMonth);
                ImportForeignHistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/ndtnn/?a=1&c={0}&s={1}&t=5&d={2}&b={3}&e={2}&p=2", (int)enumSAN.UPCOM, currCode, dt, dtEarlyMonth);
                ImportForeignHistoryByStockExchange(url);
            }
            catch (Exception ex)
            {
                string msg = string.Format("Error | {0} - Không truy vấn được link {1}", currCode, url);
                SystemConfig.SystemLog.Add(msg);
            }
        }

        private void ImportForeign2HistoryByStockExchange(string url)
        {
            BrowserSession_General br = new BrowserSession_General();
            string currCode = "";
            int indexColumn = 0;

            try
            {
                HtmlDocument doc = br.Get(url);
                if (br.Response != null)
                {
                    string xpath = "//table[@id='FPTSQuote']//tr[contains(@class,'cRow')]";
                    HtmlNodeCollection trNodeCollection = doc.DocumentNode.SelectNodes(xpath);
                    //Kiểm tra có dữ liệu không
                    if (trNodeCollection == null)
                    {
                        string msg = string.Format("Error | Không truy vấn được link {0}", url);
                        SystemConfig.SystemLog.Add(msg);
                        return;
                    }

                    foreach (HtmlNode node in trNodeCollection)
                    {
                        HtmlNodeCollection tdCollection = node.SelectNodes(".//td");
                        if (tdCollection == null)
                        {
                            string msg = string.Format("Error | Không truy vấn được link {0}", url);
                            SystemConfig.SystemLog.Add(msg);
                            return;
                        }

                        //Ngày giao dịch
                        indexColumn = 0;
                        string dateString = tdCollection[indexColumn].InnerText.Trim();
                        DateTime ngay_giao_dich;
                        if (!DateTime.TryParseExact(dateString, "dd/MM/yyyy", null,
                            DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AdjustToUniversal, out ngay_giao_dich))
                        {
                            string msg = string.Format("Error | {0} - ngay_giao_dich", currCode);
                            SystemConfig.SystemLog.Add(msg);
                            continue;
                        }

                        //Mã
                        indexColumn++;
                        currCode = tdCollection[indexColumn].InnerText.Trim();

                        //Khởi tạo object history
                        history objHistory;
                        bool isExist = InitHistory(currCode, ngay_giao_dich, out objHistory);

                        //Khối lượng giao dịch nước ngoài mua thỏa thuận
                        indexColumn += 4;
                        int klgd_nn_thoa_thuan_mua;
                        if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out klgd_nn_thoa_thuan_mua))
                        {
                            objHistory.klgd_nn_thoa_thuan_mua = klgd_nn_thoa_thuan_mua;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - klgd_nn_thoa_thuan_mua", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //% Giao dịch toàn thị trường
                        indexColumn++;

                        //Khối lượng giao dịch nước ngoài bán thỏa thuận
                        indexColumn++;
                        int klgd_nn_thoa_thuan_ban;
                        if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out klgd_nn_thoa_thuan_ban))
                        {
                            objHistory.klgd_nn_thoa_thuan_ban = klgd_nn_thoa_thuan_ban;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - klgd_nn_thoa_thuan_ban", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }

                        //Cập nhật vào CSDL
                        if (!isExist)
                            _historyRepository.Insert(objHistory);
                        else
                            _historyRepository.Update(objHistory);

                    }
                }
            }
            catch (Exception ex)
            {
                string msg = string.Format("Error | Không truy vấn được link {0}", url);
                SystemConfig.SystemLog.Add(msg);
            }
        }

        public override void ImportForeign2History(DateTime dtStart)
        {
            string url = "";
            string currCode = "";
            try
            {
                
                string dt = dtStart.Day.ToString() + "/" + dtStart.Month.ToString() + "/" + dtStart.Year.ToString();
                string dtEarlyMonth = dtStart.Day.ToString() + "/" + (dtStart.Month - 1).ToString() + "/" + dtStart.Year.ToString();

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/ndtnntt/?a=1&c={0}&s={1}&t=5&d={2}&b={3}&e={2}&p=1", (int)enumSAN.HOSE, currCode, dt, dtEarlyMonth);
                ImportForeign2HistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/ndtnntt/?a=1&c={0}&s={1}&t=5&d={2}&b={3}&e={2}&p=2", (int)enumSAN.HOSE, currCode, dt, dtEarlyMonth);
                ImportForeign2HistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/ndtnntt/?a=1&c={0}&s={1}&t=5&d={2}&b={3}&e={2}&p=1", (int)enumSAN.HAX, currCode, dt, dtEarlyMonth);
                ImportForeign2HistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/ndtnntt/?a=1&c={0}&s={1}&t=5&d={2}&b={3}&e={2}&p=2", (int)enumSAN.HAX, currCode, dt, dtEarlyMonth);
                ImportForeign2HistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/ndtnntt/?a=1&c={0}&s={1}&t=5&d={2}&b={3}&e={2}&p=1", (int)enumSAN.UPCOM, currCode, dt, dtEarlyMonth);
                ImportForeign2HistoryByStockExchange(url);

                url = string.Format("http://priceboard.fpts.com.vn/user/stock/ndtnntt/?a=1&c={0}&s={1}&t=5&d={2}&b={3}&e={2}&p=2", (int)enumSAN.UPCOM, currCode, dt, dtEarlyMonth);
                ImportForeign2HistoryByStockExchange(url);
            }
            catch (Exception ex)
            {
                string msg = string.Format("Error | {0} - Không truy vấn được link {1}", currCode, url);
                SystemConfig.SystemLog.Add(msg);
            }
        }

        
        public override string GetCurrentInfo(string currCode)
        {
            //http://ezsearch.fpts.com.vn/Services/EzData/Default2.aspx?s=1058
            BrowserSession_General br = new BrowserSession_General();

            string url = string.Format("http://ezsearch.fpts.com.vn/Services/EzData/Default2.aspx?s={0}", currCode);
            HtmlDocument doc = br.Get(url);
            System.Net.CookieCollection cookieCollect = br.Response.Cookies;

            url = string.Format(@"http://ezsearch.fpts.com.vn/Services/EzData/ProcessLoadRuntime.aspx?s={0}&cGroup=Overview&cPath=Services/EzData/Overview", currCode);
            br.SaveCookiesFrom(cookieCollect);
            doc = br.Post(url);
            
            string content = "";
            if (br.Response != null)
            {
                //string xpath = "//*[@id='tblStockInfo']";
                string xpath = "//*[@id='Table7']";
                HtmlNodeCollection nodeCollection = doc.DocumentNode.SelectNodes(xpath);

                //Kiểm tra có dữ liệu không
                if (nodeCollection == null)
                {
                    string msg = string.Format("Error | {0} - Không truy vấn được link {1}", currCode, url);
                    SystemConfig.SystemLog.Add(msg);
                    return null;
                }
                foreach (HtmlNode node in nodeCollection)
                {
                    content = node.InnerHtml;
                }
            }

            return content;
        }

        /// <summary>
        /// Tổng hợp lịch sử khớp lệnh theo lô trong ngày
        /// http://s.cafef.vn/Lich-su-giao-dich-PVT-6.chn?date=17/06/2015
        /// </summary>
        /// <param name="currCode"></param>
        public void CapNhatGiaThamChieu(string currCode, DateTime ngay_giao_dich)
        {
            //http://s.cafef.vn/Lich-su-giao-dich-L14-2.chn
            BrowserSession_General br = new BrowserSession_General();

            string url = string.Format("http://s.cafef.vn/Lich-su-giao-dich-{0}-6.chn?date={1}", currCode, ngay_giao_dich.ToString("dd/MM/yyyy"));
            HtmlDocument doc = br.Get(url);
            if (br.Response != null)
            {
                string xpath = "//*[@id='price-box']//span[2]";
                HtmlNodeCollection nodeCollection = doc.DocumentNode.SelectNodes(xpath);

                //Kiểm tra có dữ liệu không
                if (nodeCollection == null)
                {
                    string msg = string.Format("Error | {0} - Không truy vấn được link {1}", currCode, url);
                    SystemConfig.SystemLog.Add(msg);
                    return;
                }

                foreach (HtmlNode node in nodeCollection)
                {
                    //Khởi tọa object
                    history objHistory;
                    bool isExist = InitHistory(currCode, ngay_giao_dich, out objHistory);
                    if (!isExist)
                        return;

                    float gia_tham_chieu;
                    if (float.TryParse(node.InnerText.Trim(), out gia_tham_chieu))
                    {
                        objHistory.gia_tham_chieu = gia_tham_chieu;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - gia_tham_chieu", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    _historyRepository.Update(objHistory);
                }
            }
        }

    }
}

